SQL语句

您所在的位置:网站首页 sql 查找表 SQL语句

SQL语句

2024-06-20 20:24| 来源: 网络整理| 查看: 265

SQL 语句 单表查询

查询语句(SELECT)是数据库中最基本的和最重要的语句之一,其功能是从数据库中检索满足条件的数据。查询的数据源可以来自一张表,也可以来自多张表甚至来自视图,查询的结果是由0行(没有满足条件的数据)或多行记录组成的一个记录集合,并允许选择一个或多个字段作为输出字段。SELECT语句还可以对查询结果进行排序、汇总等。查询语句的基本结构可描述为:

SELECT -- 需要哪些列 FROM [JOIN ON ] -- 来自哪些表 [WHERE ] -- 根据什么条件 [GROUP BY ] [HAVING ] [ORDER BY ]

其中:

SELECT 子句用于指定输出的字段FROM 子句用于指定数据的来源WHERE 子句用于指定数据的行选择条件GROUP BY 子句用于对检索到的记录进行分组HAVING 子句用于指定对分组后结果的选择条件ORDER BY 子句用于对查询的结果进行排序 选择表中若干列

查询指定的列

-- 查询全体学生的学好与姓名 SELECT Sno, Sname FROM Student

查询全部列

-- 查询全体学生的全部信息 SELECT Sno, Sname, Ssex, Sbirthday, Sdept, Memo FROM Student -- 等价于 SELECT * FROM Student

查询表中没有的列

-- 含表达式的列:查询全体学生的姓名及年龄(年龄的列名是空) SELECT Sname, YEAR(GETDATE()) - YEAR(Sbirthday) FROM Student -- 查询全体学生的姓名、年龄、字符串“今年是”以及今年的年份(给列取别名) SELECT Sname 姓名, YEAR(GETDATE()) - YEAR(Sbirthday) 年龄, '今年是' 今年是, YEAR(GETDATE()) 年份 FROM Student 选择表中若干行

查询满足条件的元组

WHERE 子句常用的查询条件:

查询条件谓词比较=, >, >=, = 2 AND Credit ( SELECT AVG(Grade) FROM SC WHERE Cno='C01' )

带有ANY或ALL的子查询

当子查询返回多个值时,可以使用ANY或ALL的子查询,它的具体含义如下:

运算符含义> ANY大于子查询结果中某个值< ANY小于子查询结果中某个值>= ANY大于等于子查询结果中某个值 ALL大于子查询结果中所有值< ALL小于子查询结果中所有值>= ALL大于等于子查询结果中所有值 ALL ( SELECT Grade FROM SC WHERE Cno='C02' )

带EXISTS谓词的子查询

EXISTS代表存在量词 ∃ \exists ∃。使用带EXISTS谓词的子查询可以进行存在性测试,其基本使用形式为:

WHERE [NOT] EXISTS

带EXISTS谓词的子查询不返回查询的数据,只产生逻辑真值或假值。

EXISTS的含义:当子查询中有满足条件的数据时,返回真值,否则返回假值。NOT EXISTS的含义:当子查询中有满足条件的数据时,返回假值,否则返回真值。 -- 查询选了'C01'号课程的学生姓名 SELECT Sname FROM Student WHERE EXISTS ( SELECT * FROM SC WHERE SC.Sno = Student.Sno AND Cno='C04' )

带有EXISTS谓词的子查询需注意:

带EXISTS谓词的子查询是先执行外层查询,然后再执行内层查询。由外层查询决定内层查询的结果,外层查询的结果决定内层查询的执行次数。

上列过程如下:

无条件执行外层查询,在外层查询的结果集中取第一行结果,得到Sno中的一个当前值,然后根据此Sno值处理内层查询。将外层的Sno值作为已知值执行内层查询,如果在内层查询中有满足其WHERE条件的记录存在,则EXISTS返回TRUE,表示在外层查询中当前行数据为满足条件的结果,否则返回FALSE顺序处理外层表Student中第2、3…行数据,知道处理完所有行。

由于EXISTS的子查询只返回真值或假值,因此在子查询中执行列名没意义。

样例:

-- 查询至少选修了第三学期开设的全部课程的学生姓名 SELECT Sname FROM Student WHERE NOT EXISTS ( SELECT * FROM Course WHERE Semester=3 AND NOT EXISTS ( SELECT * FROM SC WHERE SC.Sno = Student.Sno AND Course.Cno = SC.Cno ) ) /* 此样例可理解为:不存在第三学期课程没有选的学生姓名 */ 查询的集合运算

SQL也提供了与关系代数中集合运算并、交和差对应的谓词,分别是UNION、INTERSECT、EXCEPT,当使用这些操作进行查询时,参与运算的两个查询需要分别用括号扩起来。

-- 查询‘计算机系’和‘机电系’的所有学生信息 (SELECT Sno, Sname, Ssex, Sdept FROM Student WHERE Sdept = '计算机系' ) UNION (SELECT Sno, Sname, Ssex, Sdept FROM Student WHERE Sdept = '机电系' ) -- 查询同时选修了‘C01’与‘C02’课程的学生学号 (SELECT Sno FROM SC WHERE Cno='C01' ) INTERSECT (SELECT Sno FROM SC WHERE Cno='C02' ) -- 查询选修了‘C01’但没选‘C02’课程的学生的学号 (SELECT Sno FROM SC WHERE Cno = 'C01' ) EXCEPT (SELECT Sno FROM SC WHERE Cno='C02' )

注:mysql没有INTERSECT和EXCEPT语句,但可以用一些条件语句实现



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3